package com.nebula.poi.serverimpl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.nebula.poi.exception.MyException;
import com.nebula.poi.mapper.UserMapper;
import com.nebula.poi.pojo.User;
import com.nebula.poi.server.UserService;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.transaction.annotation.Transactional;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: llq
 * @Date: 2019/9/20
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {

    @Autowired
    private UserMapper userMapper;


    @Override
    public List<User> selectUsers() {
        return userMapper.selectUsers();
    }

    @Transactional(readOnly = false,rollbackFor = Exception.class)
    @Override
    public boolean batchImport(String fileName, MultipartFile file) throws Exception {
        boolean notNull = false;
        List<User> userList = new ArrayList<>();
        //验证文件的格式是不是Excel，这里指user.xls
        //以任意字符开始，以.分割，忽略大小写，以xls结尾 ，\\.(?i)是忽略大小写的意思
        if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
            throw new MyException("上传文件格式不正确");
        }
        boolean isExcel2003 = true;
        if (fileName.matches("^.+\\.(?i)(xlsx)$")) {
            isExcel2003 = false;
        }
        InputStream is = file.getInputStream();
        Workbook wb = null;
        //针对Excel文件格式的不同,使用不同版本的Excel的Workbook
        if (isExcel2003) {
            //2003以前版本的Excel
            wb = new HSSFWorkbook(is);
        } else {
            //2007版本的Excel
            wb = new XSSFWorkbook(is);
        }
        //获取Excel文件里的第一张表单
        Sheet sheet = wb.getSheetAt(0);
        //判断有没有表单
        if(sheet!=null){
            notNull = true;
        }
        User user;
        //r = 2 表示从第三行开始循环 如果你的第三行开始是数据***
        //sheet.getLastRowNum()获取表单的最后一行行数
        for (int r = 2; r <= sheet.getLastRowNum(); r++) {
            //通过sheet表单对象得到 行对象
            Row row = sheet.getRow(r);
            if (row == null){
                continue;
            }

            //sheet.getLastRowNum() 的值是 10，所以Excel表中的数据至少是10条；不然报错 NullPointerException

            user = new User();


            //循环时，得到每一行的第一个单元格类型进行判断 是否是String类型
            if( row.getCell(0).getCellTypeEnum() != CellType.STRING){
                throw new MyException("导入失败(第"+(r+1)+"行,用户名请设为文本格式)");
            }

            //得到每一行第一个单元格的值
            String username = row.getCell(0).getStringCellValue();


            //判断是否为空
            if(username == null || username.isEmpty()){
                throw new MyException("导入失败(第"+(r+1)+"行,用户名未填写)");
            }


            //得到每一行的 第二个单元格的值
            row.getCell(1).setCellType(CellType.STRING);
            String password = row.getCell(1).getStringCellValue();


            if(password==null || password.isEmpty()){
                throw new MyException("导入失败(第"+(r+1)+"行,密码未填写)");
            }


            //完整的循环一次 就组成了一个对象
            user.setUsername(username);
            user.setPassword(password);
            userList.add(user);
        }
        for (User userResord : userList) {
            String name = userResord.getUsername();
            //查出数据库里面这个用户名有多少个
            int cnt = userMapper.selectByName(name);
            //如果数据库里面有这个用户了就跟新数据库，不然就插入
            if (cnt == 0) {
                userMapper.addUser(userResord);
                System.out.println(" 插入 "+userResord);
            } else {
                userMapper.updateUserByName(userResord);
                System.out.println(" 更新 "+userResord);
            }
        }
        return notNull;
    }
}
